package main

import (
	"io"
	"io/ioutil"
	"os"
)

func getSmartFileContent(path string, fileInfo *FileInfo) (content []byte, err error) {
	if !useSmartHash || fileInfo.Size <= MinSize {
		content, err = ioutil.ReadFile(path)
		if err != nil {
			return nil, err
		}
	} else {
		//20MB以上的文件,只读取部分内容用作hash计算
		content, err = getFile20ChunkBuffContent(path)
		if err != nil {
			return nil, err
		}
	}
	//fileInfo.Content = content
	return content, nil
}

// getFile20ChunkBuffContent 函数从给定的文件路径中读取前1MB的字节，并返回一个FileInfo类型的值
func getFile20ChunkBuffContent(path string) ([]byte, error) {
	file, err := os.OpenFile(path, os.O_RDONLY, 0644)
	if err != nil {
		return nil, err
	}
	// 获取文件信息
	info, err := file.Stat()
	if err != nil {
		panic(err)
	}
	// 计算每份的大小，取文件总大小除以20（向上取整）
	chunkSize := int64(info.Size() / 20)
	if chunkSize*20 < info.Size() {
		chunkSize++
	}
	// 如果文件大小小于等于50MB，则不需要进行切分和读取
	if info.Size() <= MinSize {
		// 这里可以处理文件小于等于50MB的情况
		// 例如，你可以读取整个文件
		panic("File less than MinSize:20MB")
	}

	// 计算每份要读取的大小，这里固定为1MB
	readSize := int64(minChunkSize)
	// 创建用于拼接的缓冲区
	var buffer []byte

	// 循环遍历文件的每一份
	for i := int64(0); i < info.Size(); i += chunkSize {
		// 计算本次读取的结束位置
		end := i + readSize
		if end > info.Size() {
			end = info.Size()
		}

		// 计算本次读取的起始位置
		start := i
		// 读取每份的前1MB字节
		part, err := io.ReadAll(io.NewSectionReader(file, start, end-start))
		if err != nil {
			panic(err)
		}
		// 将读取到的字节片段添加到缓冲区
		buffer = append(buffer, part...)
		// 如果缓冲区大小已经达到或超过20MB，则退出循环
		if int64(len(buffer)) >= MinSize {
			Info.Printf("int64(len(buffer)) >= MinSize :: --------> buffer size: %d, file size: %d\n", len(buffer), info.Size())
			break
		}
	}

	// 在这里，buffer就是拼接后的20MB（或小于20MB，如果文件不是20的倍数）的字节切片
	// 你可以对buffer进行进一步的处理，例如写入新文件或进行其他操作
	return buffer, nil
}
